#include "QViewSelector.h"

QViewSelector::QViewSelector()
{
	box[0]=0;box[1]=0;
	box[3]=0;box[2]=0;
	display_keys=false;
	display_links=false;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::setImage(cv::Mat& image)
{
	frame=image.clone();
	setFixedSize(image.cols,image.rows);
	update();
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::setKeysPoints(cv::Mat& keysPoints,cv::Mat& previousKeysPoints)
{
	this->keyspoints=keysPoints.clone();
	this->previousKeysPoints=previousKeysPoints.clone();
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat& QViewSelector::getMask()
{
	mask.create(frame.rows,frame.cols,CV_8UC1);
	mask.setTo(0);

	int swap=0;
	if((box[2]-box[0])<0)
	{
		swap=box[2];
		box[2]=box[0];
		box[0]=swap;
	}
	if((box[3]-box[1])<0)
	{
		swap=box[3];	
		box[3]=box[1];
		box[1]=swap;
	}
	if(box[0]<0){box[0]=0;}	
	if(box[1]<0){box[1]=0;}
	if(box[2]>frame.cols){box[2]=frame.cols;}
	if(box[3]>frame.rows){box[3]=frame.rows;}

	if((box[2]-box[0])>0 && (box[3]-box[1])>0){
	roi=mask(cv::Rect(box[0],box[1],box[2]-box[0],box[3]-box[1]));
	roi.setTo(255);}
	return mask;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::paintEvent(QPaintEvent * e)
{
	QPainter painter(this);

	//On affiche l'image en cours	
	if(frame.depth()==CV_32F)
	{
		cv::Mat tmp;	
		frame.convertTo(tmp,CV_8U,255);
		frame=tmp.clone();
	}

	if(frame.channels()==3)
	{
  	QImage tmp((uchar *)frame.data, frame.cols, frame.rows, QImage::Format_RGB888);
		painter.drawImage(rect(),tmp);
  }
	else
	{
		cv::Mat frame_rgb;		
		frame_rgb.create(frame.rows,frame.cols,CV_8UC3);				
		cvtColor(frame,frame_rgb,CV_GRAY2RGB);
		
		QImage tmp((uchar *)frame_rgb.data, frame_rgb.cols, frame_rgb.rows, QImage::Format_RGB888);
		painter.drawImage(rect(),tmp);
	}

	//on affiche la zone selectionnée
	painter.setBrush(QColor(0,255,0,32));
	painter.setPen(QColor(0,255,0));
	painter.drawRect(QRect(box[0],box[1],box[2]-box[0],box[3]-box[1]));


	//on affiche les points clefs	
	if(display_keys)
	{
		painter.setBrush(QColor(255,0,0));
		painter.setPen(QColor(255,0,0));
		for(int i=0;i<keyspoints.rows;i++)
		{
			painter.drawPoint((int)keyspoints(i,0),(int)keyspoints(i,1));
		}
		painter.setBrush(QColor(0,0,255));
		painter.setPen(QColor(0,0,255));
		for(int i=0;i<previousKeysPoints.rows;i++)
		{
			painter.drawPoint((int)previousKeysPoints(i,0),(int)previousKeysPoints(i,1));
		}
	}

	//on affiche les liens
	if(display_links)
	{
		painter.setBrush(QColor(0,255,0));
		painter.setPen(QColor(0,255,0));
		for(int i=0;i<keyspoints.rows;i++)
		{
			if(links(i)!=-1 && links(i)<previousKeysPoints.rows)
			{
				painter.drawLine(keyspoints(i,0),keyspoints(i,1),
											 	 previousKeysPoints(links(i),0),previousKeysPoints(links(i),1));	
			}
		}
	}

	painter.end();
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat& QViewSelector::getRoi()
{
	int swap=0;
	if((box[2]-box[0])<0)
	{
		swap=box[2];
		box[2]=box[0];
		box[0]=swap;
	}
	if((box[3]-box[1])<0)
	{
		swap=box[3];	
		box[3]=box[1];
		box[1]=swap;
	}
	if(box[0]<0){box[0]=0;}	
	if(box[1]<0){box[1]=0;}
	if(box[2]>frame.cols){box[2]=frame.cols;}
	if(box[3]>frame.rows){box[3]=frame.rows;}

	if((box[2]-box[0])>0 && (box[3]-box[1])>0){
	roi=frame(cv::Rect(box[0],box[1],box[2]-box[0],box[3]-box[1]));}
	return roi;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::mouseMoveEvent(QMouseEvent * e)
{
	box[2]=e->x();	
	box[3]=e->y();
	
	update();
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::mousePressEvent(QMouseEvent * e)
{
	box[0]=e->x();	
	box[1]=e->y();
	box[2]=e->x();	
	box[3]=e->y();
	update();
}
////////////////////////////////////////////////////////////////////////////////	
void QViewSelector::setLinks(cv::Mat& links)
{
	this->links=links;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::displayLinks(bool enable)
{
	display_links=enable;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::displayKeys(bool enable)
{
	display_keys=enable;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::move_box(int dx,int dy)
{
	box[0]+=dx;box[1]+=dy;
	box[3]+=dy;box[2]+=dx;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::get_box(cv::Mat_<int>& b)
{
	b(0,0)=box[0];b(0,1)=box[1];
	b(0,3)=box[3];b(0,2)=box[2];
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::set_box(cv::Mat_<int>& b,int marges)
{
	box[0]=b(0,0)-marges;box[1]=b(0,1)-marges;
	box[3]=b(0,3)+marges;box[2]=b(0,2)+marges;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::get_box_xy(cv::Mat_<float>& b)
{
	b(0,0)=(float)box[0];
	b(1,0)=(float)box[1];
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::set_box_xy(cv::Mat_<float>& b)
{
	int w=abs(box[2]-box[0]);
	int h=abs(box[3]-box[1]);	
	box[0]=(int)b(0,0);
	box[1]=(int)b(1,0);
	box[2]=box[0]+w;
	box[3]=box[1]+h;
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::get_box_xywh(cv::Mat_<float>& b)
{
	b(0,0)=(float)box[0];
	b(1,0)=(float)box[1];
	b(4,0)=(float)abs(box[2]-box[0]);
	b(5,0)=(float)abs(box[3]-box[1]);
}
////////////////////////////////////////////////////////////////////////////////
void QViewSelector::set_box_xywh(cv::Mat_<float>& b)
{
	box[0]=(int)b(0,0);
	box[1]=(int)b(1,0);
	box[2]=box[0]+b(4,0);
	box[3]=box[1]+b(5,0);

}
////////////////////////////////////////////////////////////////////////////////
